Libraries

Library aufrufen das wir nutzen wollen

Registered S3 method overwritten by 'dplyr':
  method           from
  print.rowwise_df     
-- Attaching packages --------------------------------------- tidyverse 1.2.1 --
v ggplot2 3.2.1     v purrr   0.3.2
v tibble  2.1.3     v dplyr   0.8.3
v tidyr   1.0.0     v stringr 1.4.0
v readr   1.3.1     v forcats 0.4.0
-- Conflicts ------------------------------------------ tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
Le chargement a n攼㸹cessit攼㸹 le package : RPostgreSQL

Connection

Datanbankverbindung aufbauen

Grabbing the data

Abrufen von daten um damit umzugehen

Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      

Control missing data (NA)

Kontrolle ob es fehlende werte gibt in der tabelle t_aisles

Aisle
[1] 0
[1] 0
Departments
[1] 0
[1] 0
Orders
[1] 206209
Kunden die zum ersten mal einkaufen

Es fehlen 206209 werte von 3421083 für days_since_prior (6.0275942%.

Es könnten first-time Kunden sein, also die Kunden die ihre erste Bestellung machen

Products
[1] 0
[1] 0

Jetzt wollen wir graphisch das verhältnis von Bio- zu nicht Bio-Produkte aufzeichnen

Verhältnis Bio/Nicht-bio in departments & aisles

Wir möchten auch Visualizieren was die Verhältnisse sind, zwischen die Offerte an Bio-produkte in den verschiedene Departments und Aisles.

Man kann sehen das die Anzahl an Bio-Produkte in den Departments sehr swach ist, im gegensatz zu den “normalen” Produkten.

Man kann auch hier sehen das der Verhältniss zwischen Bio-Produkten und nicht Bio_Produkten niedrig ist in spezifische aisles. Es gibt sogar aisles wo es keinlerei Bio-Produkten gibt. Dafür aber gibt es andere aisles wo der Verhältnis viel grösser ist, z.b. Baby Food Formulas und Fresh Vegetables.

Determine most bought products

Wir möchten wissen welche Produkte am meisten eingekauft werden und ob diese Organic oder nicht sind

Stammkunden analyse

Ein ziele wäre die Stammkunden erkennen und sehen ob sie verschieden einkaufen, z.b eine höhere Anzahl an Produkten pro Bestellung kaufen. Daher haben wir der durschnitt an Bestellungen berechnet sowie die Quartilen: Ausser dem Visualizieren wir mit einen Plot die Anzahl kunden die Mehrmals bei uns eingekauft haben.

[1] 17.15486
  0%  25%  50%  75% 100% 
   1    5   11   23  100 

Wir wollen auch den Durschnitt von Bestellung von jeden Kunden Berechnen.

Wir definieren Stammkunden die die mindestens einmal alle 7 Tagen bei uns einkaufen (Alle 7 Tage, im diagramm 0 bis 6)

Die totale anzahl an stammkunden ist 33374 von 206209. Dies entsprecht 16.1845506% von aller Kunden die je im laden waren

[1] 223593
[1] 1384617
[1] 16.14836

Die Anzahl an transactionen das von Stammkunden geamcht wurden entsprechen 223593 von 1384617. Das entspricht 16.1483645% aller transactionen.

A priori Algorithmus

# close the connection (don't forget to cleanup)
dbDisconnect(con)
dbUnloadDriver(drv)
Error in dbUnloadDriver(drv) : object 'drv' not found
LS0tDQp0aXRsZTogIkJpby1TcGFydGUiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQ0KLS0tDQoNCiMjIyBMaWJyYXJpZXMNCkxpYnJhcnkgYXVmcnVmZW4gZGFzIHdpciBudXR6ZW4gd29sbGVuDQoNCmBgYHtyIHNldHVwLCBlY2hvPUZBTFNFfQ0KI2luc3RhbGwucGFja2FnZXMoIlJQb3N0Z3JlU1FMIikNCiNpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQ0KDQpsaWJyYXJ5KERCSSkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KcmVxdWlyZSgiUlBvc3RncmVTUUwiKQ0KYGBgDQoNCiMjIyBDb25uZWN0aW9uDQpEYXRhbmJhbmt2ZXJiaW5kdW5nIGF1ZmJhdWVuDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KREJfSE9TVD0nODYuMTE5LjM2Ljk0JyAjb3IgODYuMTE5LjM2Ljk0IG9yIHNlcnZlcjIwNTMuY3MudGVjaG5pay5maG53LmNoDQpEQl9QT1JUID0gNTQzMg0KREJfREJOQU1FID0gJ3dhcmVua29yYl9kYicgIyBvciAnd2FyZW5rb3JiX2RiJw0KREJfVVNFUk5BTUUgPSAnZGJfdXNlcicgDQpEQl9QQVNTV09SRCA9ICdkYl91c2VyX3B3Jw0KDQpjb24gPC0gREJJOjpkYkNvbm5lY3Qob2RiYzo6b2RiYygpLA0KICAgICAgICAgICAgICAgICAgICAgIERyaXZlciAgID0gIlBvc3RncmVTUUwgVW5pY29kZSh4NjQpIiwNCiAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXIgICA9IERCX0hPU1QsDQogICAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2UgPSBEQl9EQk5BTUUsDQogICAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgPSBEQl9VU0VSTkFNRSwNCiAgICAgICAgICAgICAgICAgICAgICBQV0QgICAgICA9IERCX1BBU1NXT1JELA0KICAgICAgICAgICAgICAgICAgICAgIFBvcnQgICAgID0gREJfUE9SVCwNCgkJCQkJCQkJCQkJZW5jb2RpbmcgPSAibGF0aW4xIiApDQpgYGANCg0KIyMjIEdyYWJiaW5nIHRoZSBkYXRhDQpBYnJ1ZmVuIHZvbiBkYXRlbiB1bSBkYW1pdCB1bXp1Z2VoZW4NCg0KYGBge3IsIGVjaG89RkFMU0V9DQp0X3Byb2R1Y3RzIDwtIHRibChjb24sICJwcm9kdWN0IikNCnRfcHJvZHVjdHMgPC0gYXMuZGF0YS5mcmFtZSh0X3Byb2R1Y3RzKQ0KDQp0X2Fpc2xlcyA8LSB0YmwoY29uLCAiYWlzbGUiKQ0KdF9haXNsZXMgPC0gYXMuZGF0YS5mcmFtZSh0X2Fpc2xlcykNCg0KdF9kZXBhcnRtZW50cyA8LSB0YmwoY29uLCAiZGVwYXJ0bWVudCIpDQp0X2RlcGFydG1lbnRzIDwtIGFzLmRhdGEuZnJhbWUodF9kZXBhcnRtZW50cykNCg0KdF9vcmRlcnMgPC0gdGJsKGNvbiwgIm9yZGVycyIpDQp0X29yZGVycyA8LSBhcy5kYXRhLmZyYW1lKHRfb3JkZXJzKQ0KDQojdF9vcmRlcnNfcHJpb3IgPC0gdGJsKGNvbiwgIm9yZGVyc19wcm9kdWN0X3ByaW9yIikNCiN0X29yZGVyc19wcmlvciA8LSBhcy5kYXRhLmZyYW1lKCJ0X29yZGVyc19wcmlvciIpDQoNCnRfb3JkZXJzX3RyYWluIDwtIHRibChjb24sICJvcmRlcnNfcHJvZHVjdF90cmFpbiIpDQp0X29yZGVyc190cmFpbiA8LSBhcy5kYXRhLmZyYW1lKHRfb3JkZXJzX3RyYWluKQ0KDQoNCiN0X3Byb2R1Y3RzIDwtIGRiR2V0UXVlcnkoY29uLCAgIlNFTEVDVCAqIEZyb20gcHJvZHVjdCIpDQojdF9haXNsZXMgPC0gZGJHZXRRdWVyeShjb24sICAiU0VMRUNUICogRnJvbSBhaXNsZSIpDQojdF9kZXBhcnRtZW50cyA8LSBkYkdldFF1ZXJ5KGNvbiwgICJTRUxFQ1QgKiBGcm9tIGRlcGFydG1lbnQiKQ0KI3Rfb3JkZXJzIDwtIGRiR2V0UXVlcnkoY29uLCAgIlNFTEVDVCAqIEZyb20gb3JkZXJzIikNCiN0X29yZGVyc19wcmlvciA8LSBkYkdldFF1ZXJ5KGNvbiwgICJTRUxFQ1QgKiBGcm9tIG9yZGVyc19wcm9kdWN0X3ByaW9yIikNCiN0X29yZGVyc190cmFpbiA8LSBkYkdldFF1ZXJ5KGNvbiwgICJTRUxFQ1QgKiBGcm9tIG9yZGVyc19wcm9kdWN0X3RyYWluIikNCmBgYA0KDQojIyMjIENvbnRyb2wgbWlzc2luZyBkYXRhIChOQSkNCktvbnRyb2xsZSBvYiBlcyBmZWhsZW5kZSB3ZXJ0ZSBnaWJ0IGluIGRlciB0YWJlbGxlIHRfYWlzbGVzDQoNCiMjIyMjIEFpc2xlDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNSRVRVUk5TIElOVEVHRVIsIFNMT1dFUg0KdF9haXNsZXMgJT4lIA0KCXB1bGwoYWlzbGUpICU+JSANCglpcy5uYSgpICU+JSANCglzdW0oKQ0KDQojUkVUVVJOUyBMSVNULCBGQVNURVINCiN0X2Fpc2xlcyAlPiUNCiMgIGZpbHRlcihpcy5uYShhaXNsZSkpICU+JQ0KIwljb3VudCgpDQoNCnRfYWlzbGVzICU+JSANCglwdWxsKGFpc2xlX2lkKSAlPiUgDQoJaXMubmEoKSAlPiUgDQoJc3VtKCkNCg0KI29ubHkgd29ya3Mgd2l0aCB0YWJlbGxlbg0KI3RfYWlzbGVzICU+JSANCiMJbXV0YXRlKGFpc2xlX2lkX05BID0gaXMubmEoYWlzbGVfaWQpKSAlPiUgDQojCXN1bW1hcmlzZShhaXNsZV9pZF9OQV9zdW0gPSBzdW0oYWlzbGVfaWRfTkEpKQ0KYGBgDQoNCiMjIyMjIERlcGFydG1lbnRzDQpgYGB7ciwgZWNobz1GQUxTRX0NCnRfZGVwYXJ0bWVudHMgJT4lDQogIHB1bGwoZGVwYXJ0bWVudCkgJT4lIA0KCWlzLm5hKCkgJT4lIA0KCXN1bSgpDQoNCnRfZGVwYXJ0bWVudHMgJT4lDQogIHB1bGwoZGVwYXJ0bWVudF9pZCkgJT4lIA0KCWlzLm5hKCkgJT4lIA0KCXN1bSgpDQpgYGANCg0KIyMjIyMgT3JkZXJzDQpgYGB7ciwgZWNobz1GQUxTRX0NCnRfb3JkZXJzICU+JQ0KICBwdWxsKG9yZGVyc19pZCkgJT4lIA0KCWlzLm5hKCkgJT4lIA0KCXN1bSgpDQoNCnRfb3JkZXJzICU+JQ0KICBwdWxsKHVzZXJfaWQpICU+JSANCglpcy5uYSgpICU+JSANCglzdW0oKQ0KDQp0X29yZGVycyAlPiUNCiAgcHVsbChldmFsX3NldCkgJT4lIA0KCWlzLm5hKCkgJT4lIA0KCXN1bSgpDQoNCnRfb3JkZXJzICU+JQ0KICBwdWxsKG9yZGVyX251bWJlcikgJT4lIA0KCWlzLm5hKCkgJT4lIA0KCXN1bSgpDQoNCnRfb3JkZXJzICU+JQ0KICBwdWxsKG9yZGVyX2RvdykgJT4lIA0KCWlzLm5hKCkgJT4lIA0KCXN1bSgpDQoNCnRfb3JkZXJzICU+JQ0KICBwdWxsKG9yZGVyX2hvdXJfb2ZfZGF5KSAlPiUgDQoJaXMubmEoKSAlPiUgDQoJc3VtKCkNCg0KbWlzc2luZ19wcmlvcl9vcmRlcnMgPC0gdF9vcmRlcnMgJT4lIA0KCXB1bGwoZGF5c19zaW5jZV9wcmlvcl9vcmRlcikgJT4lIA0KCWlzLm5hKCkgJT4lIA0KCXN1bSgpDQoNCiN4IDwtIHRfb3JkZXJzICU+JSANCiMJc3VtbWFyaXplKG4oKSkNCiN4IDwtIHRhbGx5KHRfb3JkZXJzKSAjZ2VodCBhdWNoDQoNCiN4IDwtIGFzLmRhdGEuZnJhbWUoeCkNCiNudW1iZXJfb3JkZXJzX3RvdCA8LSBhcy5pbnRlZ2VyKHhbWzFdXSkNCg0KbWlzc2luZ19wcmlvcl9wcm96ZW50IDwtIHJvdW5kKDEwMCptaXNzaW5nX3ByaW9yX29yZGVycy9udW1iZXJfb3JkZXJzX3RvdCwgMTApDQpgYGANCg0KIyMjIyMjIEt1bmRlbiBkaWUgenVtIGVyc3RlbiBtYWwgZWlua2F1ZmVuDQpFcyBmZWhsZW4gYHIgbWlzc2luZ19wcmlvcl9vcmRlcnNgIHdlcnRlIHZvbiBgciBudW1iZXJfb3JkZXJzX3RvdGAgZsO8ciBkYXlzX3NpbmNlX3ByaW9yIChgciBtaXNzaW5nX3ByaW9yX3Byb3plbnRgJS4gDQoNCkVzIGvDtm5udGVuIGZpcnN0LXRpbWUgS3VuZGVuIHNlaW4sIGFsc28gZGllIEt1bmRlbiBkaWUgaWhyZSBlcnN0ZSBCZXN0ZWxsdW5nIG1hY2hlbg0KDQojIyMjIyBQcm9kdWN0cw0KYGBge3IsIGVjaG89RkFMU0V9DQp0X3Byb2R1Y3RzICU+JQ0KICBwdWxsKHByb2R1Y3RfaWQpICU+JSANCglpcy5uYSgpICU+JSANCglzdW0oKQ0KDQp0X3Byb2R1Y3RzICU+JQ0KICBwdWxsKHByb2R1Y3RfbmFtZSkgJT4lIA0KCWlzLm5hKCkgJT4lIA0KCXN1bSgpDQpgYGANCg0KSmV0enQgd29sbGVuIHdpciBncmFwaGlzY2ggZGFzIHZlcmjDpGx0bmlzIHZvbiBCaW8tIHp1IG5pY2h0IEJpby1Qcm9kdWt0ZSBhdWZ6ZWljaG5lbg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCm9yZ19ub3RvcmcgPC0gdF9wcm9kdWN0cyAlPiUNCiAgbXV0YXRlKG9yZ2FuaWMgPSBzdHJfZGV0ZWN0KHRvbG93ZXIocHJvZHVjdF9uYW1lKSwgcGF0dGVybiA9ICJvcmdhbmljIikpICU+JQ0KICBncm91cF9ieShvcmdhbmljKSAlPiUNCiAgY291bnQoKSAlPiUNCiAgbXV0YXRlKG4gPSBhcy5pbnRlZ2VyKG4pKQ0KDQpnZ3Bsb3Qob3JnX25vdG9yZykgKw0KICBnZW9tX2NvbChhZXMoeCA9IG9yZ2FuaWMsIHkgPSBuKSkNCmBgYA0KDQoNCiMjIyBWZXJow6RsdG5pcyBCaW8vTmljaHQtYmlvIGluIGRlcGFydG1lbnRzICYgYWlzbGVzDQoNCldpciBtw7ZjaHRlbiBhdWNoIFZpc3VhbGl6aWVyZW4gd2FzIGRpZSBWZXJow6RsdG5pc3NlIHNpbmQsIHp3aXNjaGVuIGRpZSBPZmZlcnRlIGFuIEJpby1wcm9kdWt0ZSBpbiBkZW4gdmVyc2NoaWVkZW5lIERlcGFydG1lbnRzIHVuZCBBaXNsZXMuIA0KDQpgYGB7ciwgZmlnLmhlaWdodCA9IDcsIGVjaG89RkFMU0V9DQpWZXJoYWx0X2RlcCA8LSBmdWxsX2pvaW4odF9wcm9kdWN0cywgdF9haXNsZXMsICJhaXNsZV9pZCIpICU+JQ0KCWZ1bGxfam9pbih0X2RlcGFydG1lbnRzLCAiZGVwYXJ0bWVudF9pZCIpICU+JQ0KCXNlbGVjdCgtYyhhaXNsZV9pZCwgZGVwYXJ0bWVudF9pZCwgcHJvZHVjdF9pZCkpICU+JQ0KICBtdXRhdGUob3JnYW5pYyA9IHN0cl9kZXRlY3QodG9sb3dlcihwcm9kdWN0X25hbWUpLCBwYXR0ZXJuID0gIm9yZ2FuaWMiKSkgJT4lDQogIGdyb3VwX2J5KGRlcGFydG1lbnQsIG9yZ2FuaWMpICU+JQ0KCWNvdW50KG5hbWUgPSAiYW56YWhsX3Byb2R1a3RlIikgJT4lDQogIG11dGF0ZShhbnphaGxfcHJvZHVrdGUgPSBhcy5pbnRlZ2VyKGFuemFobF9wcm9kdWt0ZSkpICU+JQ0KCWFycmFuZ2UoLWFuemFobF9wcm9kdWt0ZSkNCg0KI1ZlcmhhbHRfZGVwDQoNCmdncGxvdChWZXJoYWx0X2RlcCkgKw0KICBnZW9tX2NvbChhZXMoeCA9IHJlb3JkZXIoZGVwYXJ0bWVudCwgYW56YWhsX3Byb2R1a3RlKSAseSA9IGFuemFobF9wcm9kdWt0ZSwgZmlsbCA9IG9yZ2FuaWMpKSAgKw0KICBjb29yZF9mbGlwKCkNCmBgYA0KDQpNYW4ga2FubiBzZWhlbiBkYXMgZGllIEFuemFobCBhbiBCaW8tUHJvZHVrdGUgaW4gZGVuIERlcGFydG1lbnRzIHNlaHIgc3dhY2ggaXN0LCBpbSBnZWdlbnNhdHogenUgZGVuICJub3JtYWxlbiIgIFByb2R1a3Rlbi4gDQoNCmBgYHtyLCBmaWcuaGVpZ2h0ID0gMTcsIGVjaG89RkFMU0V9DQpWZXJoYWx0X2Fpc2xlIDwtIGZ1bGxfam9pbih0X3Byb2R1Y3RzLCB0X2Fpc2xlcywgImFpc2xlX2lkIikgJT4lDQoJZnVsbF9qb2luKHRfZGVwYXJ0bWVudHMsICJkZXBhcnRtZW50X2lkIikgJT4lDQoJc2VsZWN0KC1jKGFpc2xlX2lkLCBkZXBhcnRtZW50X2lkLCBwcm9kdWN0X2lkKSkgJT4lDQogIG11dGF0ZShvcmdhbmljID0gc3RyX2RldGVjdCh0b2xvd2VyKHByb2R1Y3RfbmFtZSksIHBhdHRlcm4gPSAib3JnYW5pYyIpKSAlPiUNCiAgZ3JvdXBfYnkoYWlzbGUsIG9yZ2FuaWMpICU+JQ0KCWNvdW50KG5hbWUgPSAiYW56YWhsX3Byb2R1a3RlIikgJT4lDQogIG11dGF0ZShhbnphaGxfcHJvZHVrdGUgPSBhcy5pbnRlZ2VyKGFuemFobF9wcm9kdWt0ZSkpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQoJYXJyYW5nZSgtYW56YWhsX3Byb2R1a3RlKQ0KDQojVmVyaGFsdF9haXNsZQ0KDQpnZ3Bsb3QoVmVyaGFsdF9haXNsZSkgKw0KICBnZW9tX2NvbChhZXMoeCA9IHJlb3JkZXIoYXMuZmFjdG9yKGFpc2xlKSwgYW56YWhsX3Byb2R1a3RlKSwgeSA9IGFuemFobF9wcm9kdWt0ZSwgZmlsbCA9IG9yZ2FuaWMpKSArDQogIGNvb3JkX2ZsaXAoKQ0KDQojdmVyaGFsdF9haXNsZSBzYXZlIG9yIGFzIGNzdg0KI3NhdmUoVmVyaGFsdF9haXNsZSwgZmlsZSA9ICJWZXJoYWx0X2Fpc2xlLlJEYXRhIikNCiN3cml0ZS5jc3YoVmVyaGFsdF9haXNsZSwnVmVyaGFsdF9haXNsZS5jc3YnKQ0KYGBgDQoNCk1hbiBrYW5uIGF1Y2ggaGllciBzZWhlbiBkYXMgZGVyIFZlcmjDpGx0bmlzcyB6d2lzY2hlbiBCaW8tUHJvZHVrdGVuIHVuZCBuaWNodCBCaW9fUHJvZHVrdGVuIG5pZWRyaWcgaXN0IGluIHNwZXppZmlzY2hlIGFpc2xlcy4gRXMgZ2lidCBzb2dhciBhaXNsZXMgd28gZXMga2VpbmxlcmVpIEJpby1Qcm9kdWt0ZW4gZ2lidC4gRGFmw7xyIGFiZXIgZ2lidCBlcyBhbmRlcmUgYWlzbGVzIHdvIGRlciBWZXJow6RsdG5pcyB2aWVsIGdyw7Zzc2VyIGlzdCwgei5iLiBCYWJ5IEZvb2QgRm9ybXVsYXMgdW5kIEZyZXNoIFZlZ2V0YWJsZXMuIA0KDQpgYGB7ciwgZmlnLmhlaWdodCA9IDE4LCBlY2hvPUZBTFNFLCByZXN1bHRzPSJoaWRlIn0NClZlcmhhbHRfYWlzbGVfbm9yZyA8LSBmdWxsX2pvaW4odF9wcm9kdWN0cywgdF9haXNsZXMsICJhaXNsZV9pZCIpICU+JQ0KCWZ1bGxfam9pbih0X2RlcGFydG1lbnRzLCAiZGVwYXJ0bWVudF9pZCIpICU+JQ0KCXNlbGVjdCgtYyhhaXNsZV9pZCwgZGVwYXJ0bWVudF9pZCwgcHJvZHVjdF9pZCkpICU+JQ0KCW11dGF0ZShvcmdhbmljID0gc3RyX2RldGVjdCh0b2xvd2VyKHByb2R1Y3RfbmFtZSksIHBhdHRlcm4gPSAib3JnYW5pYyIpKSAlPiUNCiAgZ3JvdXBfYnkoYWlzbGUsIG9yZ2FuaWMpICU+JQ0KCWNvdW50KG5hbWUgPSAiYW56YWhsX3Byb2R1a3RlIikgJT4lDQogIG11dGF0ZShhbnphaGxfcHJvZHVrdGUgPSBhcy5pbnRlZ2VyKGFuemFobF9wcm9kdWt0ZSkpICU+JQ0KCWZpbHRlcihvcmdhbmljID09IEZBTFNFKQ0KDQpWZXJoYWx0X2Fpc2xlX29yZyA8LSBmdWxsX2pvaW4odF9wcm9kdWN0cywgdF9haXNsZXMsICJhaXNsZV9pZCIpICU+JQ0KCWZ1bGxfam9pbih0X2RlcGFydG1lbnRzLCAiZGVwYXJ0bWVudF9pZCIpICU+JQ0KCXNlbGVjdCgtYyhhaXNsZV9pZCwgZGVwYXJ0bWVudF9pZCwgcHJvZHVjdF9pZCkpICU+JQ0KCW11dGF0ZShvcmdhbmljID0gc3RyX2RldGVjdCh0b2xvd2VyKHByb2R1Y3RfbmFtZSksIHBhdHRlcm4gPSAib3JnYW5pYyIpKSAlPiUNCiAgZ3JvdXBfYnkoYWlzbGUsIG9yZ2FuaWMpICU+JQ0KCWNvdW50KG5hbWUgPSAiYW56YWhsX3Byb2R1a3RlIikgJT4lDQogIG11dGF0ZShhbnphaGxfcHJvZHVrdGUgPSBhcy5pbnRlZ2VyKGFuemFobF9wcm9kdWt0ZSkpICU+JQ0KCWZpbHRlcihvcmdhbmljID09IFRSVUUpDQoNCk5ld19WZXJoYWx0X2Fpc2xlIDwtIGZ1bGxfam9pbihWZXJoYWx0X2Fpc2xlX29yZywgVmVyaGFsdF9haXNsZV9ub3JnLCAiYWlzbGUiKSAlPiUNCgltdXRhdGUoYW56YWhsX3Byb2R1a3RlX29yZyA9IGFuemFobF9wcm9kdWt0ZS54KSAlPiUNCgltdXRhdGUoYW56YWhsX3Byb2R1a3RlX25vcmcgPSBhbnphaGxfcHJvZHVrdGUueSkgJT4lDQoJdW5ncm91cCgpICU+JQ0KCXNlbGVjdChjKGFpc2xlLCBhbnphaGxfcHJvZHVrdGVfb3JnLCBhbnphaGxfcHJvZHVrdGVfbm9yZykpICU+JQ0KCW11dGF0ZShhbnphaGxfcHJvZHVrdGVfb3JnID0gYXMuaW50ZWdlcihhbnphaGxfcHJvZHVrdGVfb3JnKSkNCg0KTmV3X1ZlcmhhbHRfYWlzbGVbaXMubmEoTmV3X1ZlcmhhbHRfYWlzbGUpXSA8LSBhcy5pbnRlZ2VyKDApDQoNCk5ld19WZXJoYWx0X2Fpc2xlDQoNCmdncGxvdChOZXdfVmVyaGFsdF9haXNsZSkgKw0KICBnZW9tX2NvbChhZXMoeCA9IHJlb3JkZXIoYXMuZmFjdG9yKGFpc2xlKSwgYW56YWhsX3Byb2R1a3RlX29yZyArIGFuemFobF9wcm9kdWt0ZV9ub3JnKSwgeSA9IGFuemFobF9wcm9kdWt0ZV9vcmcgKyBhbnphaGxfcHJvZHVrdGVfbm9yZykpICsNCgkjc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJhbnphaGxfcHJvZHVrdGVfb3JnIiA9ICIjRTA4MjE0IiwgImFuemFobF9wcm9kdWt0ZV9ub3JnIiA9ICIjQTA4MjE0IikpKw0KCQ0KCSNodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy82OTE5MDI1L2hvdy10by1hc3NpZ24tY29sb3JzLXRvLWNhdGVnb3JpY2FsLXZhcmlhYmxlcy1pbi1nZ3Bsb3QyLXRoYXQtaGF2ZS1zdGFibGUtbWFwcGluDQoJDQogIGNvb3JkX2ZsaXAoKQ0KYGBgDQoNCg0KIyMjIERldGVybWluZSBtb3N0IGJvdWdodCBwcm9kdWN0cw0KDQpXaXIgbcO2Y2h0ZW4gd2lzc2VuIHdlbGNoZSBQcm9kdWt0ZSBhbSBtZWlzdGVuIGVpbmdla2F1ZnQgd2VyZGVuIHVuZCBvYiBkaWVzZSBPcmdhbmljIG9kZXIgbmljaHQgc2luZA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCm1vc3RfYm91Z2h0X2FsbCA8LSBmdWxsX2pvaW4odF9wcm9kdWN0cywgdF9vcmRlcnNfdHJhaW4sICJwcm9kdWN0X2lkIikgJT4lDQoJc2VsZWN0KC1jKGFpc2xlX2lkLCBkZXBhcnRtZW50X2lkLCBpbmRleCwgYWRkX3RvX2NhcnRfb3JkZXIsIHJlb3JkZXJlZCkpICU+JQ0KCW11dGF0ZShvcmdhbmljID0gc3RyX2RldGVjdCh0b2xvd2VyKHByb2R1Y3RfbmFtZSksIHBhdHRlcm4gPSAib3JnYW5pYyIpKSAlPiUNCiAgZ3JvdXBfYnkob3JnYW5pYykgJT4lDQoJY291bnQocHJvZHVjdF9uYW1lKSAlPiUNCiAgbXV0YXRlKG4gPSBhcy5pbnRlZ2VyKG4pKSAlPiUNCglhcnJhbmdlKC1uKSAlPiUNCgloZWFkKDMwKQ0KDQptb3N0X2JvdWdodF9hbGwNCg0KZ2dwbG90KG1vc3RfYm91Z2h0X2FsbCkgKw0KICBnZW9tX2NvbChhZXMoeCA9IHJlb3JkZXIocHJvZHVjdF9uYW1lLCBuKSwgeSA9IG4sIGZpbGwgPSBvcmdhbmljKSkgKw0KICBjb29yZF9mbGlwKCkNCmBgYA0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCByZXN1bHRzPSJoaWRlIn0NCiMgRGV0ZXJtaW5lIG1vc3QgYm91Z2h0IG9yZ2FuaWMgcHJvZHVjdHMNCg0KbW9zdF9ib3VnaHRfb3JnIDwtIGZ1bGxfam9pbih0X3Byb2R1Y3RzLCB0X29yZGVyc190cmFpbiwgInByb2R1Y3RfaWQiKSAlPiUNCglzZWxlY3QoLWMoYWlzbGVfaWQsIGRlcGFydG1lbnRfaWQsIGluZGV4LCBhZGRfdG9fY2FydF9vcmRlciwgcmVvcmRlcmVkKSkgJT4lDQogIG11dGF0ZShvcmdhbmljID0gc3RyX2RldGVjdCh0b2xvd2VyKHByb2R1Y3RfbmFtZSksIHBhdHRlcm4gPSAib3JnYW5pYyIpKSAlPiUNCiAgbXV0YXRlKG9yZ2FuaWMgPSBhcy5pbnRlZ2VyKG9yZ2FuaWMpKSAlPiUNCiAgZmlsdGVyKG9yZ2FuaWMgPT0gMSkgJT4lDQoJY291bnQocHJvZHVjdF9uYW1lKSAlPiUNCiAgbXV0YXRlKG4gPSBhcy5pbnRlZ2VyKG4pKSAgJT4lDQoJYXJyYW5nZSgtbikgJT4lDQoJaGVhZCgzMCkNCg0KbW9zdF9ib3VnaHRfb3JnDQoNCmdncGxvdChtb3N0X2JvdWdodF9vcmcpICsNCiAgZ2VvbV9jb2woYWVzKHggPSByZW9yZGVyKHByb2R1Y3RfbmFtZSwgbiksIHkgPSBuKSkgKw0KICBjb29yZF9mbGlwKCkNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRSwgZWNobz1GQUxTRSwgcmVzdWx0cz0iaGlkZSJ9DQojTW9zdCBib3VnaHQgbm9uLW9yZ2FuaWMgcHJvZHVjdHMNCg0KbW9zdF9ib3VnaHRfbm9ub3JnIDwtIGZ1bGxfam9pbih0X3Byb2R1Y3RzLCB0X29yZGVyc190cmFpbiwgInByb2R1Y3RfaWQiKSAlPiUNCglzZWxlY3QoLWMoYWlzbGVfaWQsIGRlcGFydG1lbnRfaWQsIGluZGV4LCBhZGRfdG9fY2FydF9vcmRlciwgcmVvcmRlcmVkKSkgJT4lDQogIG11dGF0ZShvcmdhbmljID0gc3RyX2RldGVjdCh0b2xvd2VyKHByb2R1Y3RfbmFtZSksIHBhdHRlcm4gPSAib3JnYW5pYyIpKSAlPiUNCiAgbXV0YXRlKG9yZ2FuaWMgPSBhcy5pbnRlZ2VyKG9yZ2FuaWMpKSAlPiUNCiAgZmlsdGVyKG9yZ2FuaWMgPT0gMCkgJT4lDQoJY291bnQocHJvZHVjdF9uYW1lKSAlPiUNCiAgbXV0YXRlKG4gPSBhcy5pbnRlZ2VyKG4pKSAgJT4lDQoJYXJyYW5nZSgtbikgJT4lDQoJaGVhZCgzMCkNCg0KbW9zdF9ib3VnaHRfbm9ub3JnDQoNCmdncGxvdChtb3N0X2JvdWdodF9ub25vcmcpICsNCiAgZ2VvbV9jb2woYWVzKHggPSByZW9yZGVyKHByb2R1Y3RfbmFtZSwgbiksIHkgPSBuKSkgKw0KICBjb29yZF9mbGlwKCkNCmBgYA0KDQoNCg0KIyMgU3RhbW1rdW5kZW4gYW5hbHlzZQ0KDQpFaW4gemllbGUgd8OkcmUgZGllIFN0YW1ta3VuZGVuIGVya2VubmVuIHVuZCBzZWhlbiBvYiBzaWUgdmVyc2NoaWVkZW4gZWlua2F1ZmVuLCB6LmIgZWluZSBow7ZoZXJlIEFuemFobCBhbiBQcm9kdWt0ZW4gcHJvIEJlc3RlbGx1bmcga2F1ZmVuLiBEYWhlciBoYWJlbiB3aXIgZGVyIGR1cnNjaG5pdHQgYW4gQmVzdGVsbHVuZ2VuIGJlcmVjaG5ldCBzb3dpZSBkaWUgUXVhcnRpbGVuOiBBdXNzZXIgZGVtIFZpc3VhbGl6aWVyZW4gd2lyIG1pdCBlaW5lbiBQbG90IGRpZSBBbnphaGwga3VuZGVuIGRpZSBNZWhybWFscyBiZWkgdW5zIGVpbmdla2F1ZnQgaGFiZW4uIA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCm9yZGVyX251bWJlcl9yYW5nZV9jbGllbnQgPC0gdF9vcmRlcnMgJT4lIA0KICBncm91cF9ieShvcmRlcnNfaWQpICU+JQ0KICBzdW1tYXJpc2UobnJfb2Zfb3JkZXJzID0gbGFzdChvcmRlcl9udW1iZXIpKSAlPiUNCgljb3VudChucl9vZl9vcmRlcnMpDQoNCm9yZGVyX3JhbmdlX2NsaWVudCA8LSB0X29yZGVycyAlPiUgDQogIGdyb3VwX2J5KG9yZGVyc19pZCkgJT4lDQogIHN1bW1hcmlzZShucl9vZl9vcmRlcnMgPSBsYXN0KG9yZGVyX251bWJlcikpDQoNCm9yZGVyX251bWJlcl9yYW5nZV9jbGllbnQNCiNvcmRlcl9yYW5nZV9jbGllbnQNCg0KZ2dwbG90KGRhdGEgPSBvcmRlcl9udW1iZXJfcmFuZ2VfY2xpZW50KSArIA0KICBnZW9tX2NvbChtYXBwaW5nID0gYWVzKHggPSBucl9vZl9vcmRlcnMsIHkgPSBuKSwgd2lkdGg9MC45LCBmaWxsID0gIiNGRjk5OTkiKSArDQogIHhsYWIoIm5yX29mX29yZGVycyIpICsgeWxhYigiTnIgb2YgY2xpZW50cyIpICsNCgljb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCw1MCkpICsNCiAgZ2d0aXRsZSgiTnVtYmVyIG9mIGNsaWVudHMgd2l0aCBzYW1lIG9yZGVyIGNvdW50IikgDQoNCm1lYW5fcmFuZ2VfY2xpZW50c19zaXplIDwtIG1lYW4ob3JkZXJfcmFuZ2VfY2xpZW50JG5yX29mX29yZGVycykNCnF1YW50aWxlX3JhbmdlX2NsaWVudHNfc2l6ZSA8LSBxdWFudGlsZShvcmRlcl9yYW5nZV9jbGllbnQkbnJfb2Zfb3JkZXJzKQ0KDQptZWFuX3JhbmdlX2NsaWVudHNfc2l6ZQ0KcXVhbnRpbGVfcmFuZ2VfY2xpZW50c19zaXplDQpgYGANCg0KV2lyIHdvbGxlbiBhdWNoIGRlbiBEdXJzY2huaXR0IHZvbiBCZXN0ZWxsdW5nIHZvbiBqZWRlbiBLdW5kZW4gQmVyZWNobmVuLiANCg0KYGBge3IsIGVjaG89RkFMU0V9DQpvcmRlcl9mcmVxIDwtIHRfb3JkZXJzICU+JSANCiAgZ3JvdXBfYnkodXNlcl9pZCkgJT4lDQoJbmEub21pdCAlPiUNCgltdXRhdGUobWVhbl9mcmVxID0gbWVhbihkYXlzX3NpbmNlX3ByaW9yX29yZGVyKSkgJT4lDQoJc3VtbWFyaXNlKG1lYW5fZnJlcSA9IGxhc3QobWVhbl9mcmVxKSkgJT4lDQoJbXV0YXRlKG1lYW5fZnJlcSA9IGFzLmludGVnZXIobWVhbl9mcmVxKSkgDQoJDQojb3JkZXJfZnJlcQ0KDQpnZ3Bsb3QoZGF0YSA9IG9yZGVyX2ZyZXEpICsgDQogIGdlb21fYmFyKG1hcHBpbmcgPSBhZXMoeCA9IG1lYW5fZnJlcSksIHdpZHRoID0gMC45LCBmaWxsID0gIiNGRjk5OTkiKSArDQogIHhsYWIoImNsaWVudHMgYnV5IGV2ZXJ5IG4gZGF5cyIpICsgeWxhYigiTnIgb2YgY2xpZW50cyIpICsNCiAgZ2d0aXRsZSgiQXZlcmFnZSBmcmVxdWVuY3kgb2YgZGF5cyBzaW5jZSBsYXN0IG9yZGVyIikNCg0KI01haXhtYWxlIGFuemFobCB0YWdlIHp3aXNjaGVuIGVpbmvDpHVmZQ0KbWF4X2RheXNfc2luY2VfbGFzdF9mb3Jfc3RhbW0gPC0gNw0KYGBgDQoNCldpciBkZWZpbmllcmVuIFN0YW1ta3VuZGVuIGRpZSBkaWUgbWluZGVzdGVucyBlaW5tYWwgYWxsZSBgciBtYXhfZGF5c19zaW5jZV9sYXN0X2Zvcl9zdGFtbWAgVGFnZW4gYmVpIHVucyBlaW5rYXVmZW4gKEFsbGUgYHIgbWF4X2RheXNfc2luY2VfbGFzdF9mb3Jfc3RhbW1gIFRhZ2UsIGltIGRpYWdyYW1tIDAgYmlzIGByIG1heF9kYXlzX3NpbmNlX2xhc3RfZm9yX3N0YW1tLTFgKQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCkFuemFobF9zdGFtbWt1bmRlbiA8LSBvcmRlcl9mcmVxICU+JQ0KCWZpbHRlcihtZWFuX2ZyZXEgPD0gbWF4X2RheXNfc2luY2VfbGFzdF9mb3Jfc3RhbW0pICU+JQ0KCWNvdW50KCkNClRvdF9rdW5kZW4gPC0gb3JkZXJfZnJlcSAlPiUNCgljb3VudCgpDQoNCkFuemFobF9zdGFtbWt1bmRlbiA8LSBBbnphaGxfc3RhbW1rdW5kZW4kbg0KVG90X2t1bmRlbiA8LSBUb3Rfa3VuZGVuJG4NClByb3plbnRfc3RhbW0gPC0gMTAwKkFuemFobF9zdGFtbWt1bmRlbi9Ub3Rfa3VuZGVuDQpgYGANCg0KRGllIHRvdGFsZSBhbnphaGwgYW4gc3RhbW1rdW5kZW4gaXN0IGByIEFuemFobF9zdGFtbWt1bmRlbmAgdm9uIGByIFRvdF9rdW5kZW5gLiBEaWVzIGVudHNwcmVjaHQgYHIgUHJvemVudF9zdGFtbWAlIHZvbiAgYWxsZXIgS3VuZGVuIGRpZSBqZSBpbSBsYWRlbiB3YXJlbg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNDcmVhdGUgYSBuZXcgdGFibGUgd2l0aCBPcmRlcl9pZCBhbmQgbnJfb2ZfaXRlbXMgcGVyIG9yZGVyDQppdGVtc19wZXJfb3JkZXIgPC0gdF9vcmRlcnNfdHJhaW4gJT4lIA0KICBncm91cF9ieShvcmRlcnNfaWQpICU+JQ0KICBzdW1tYXJpc2UobnJfb2ZfaXRlbXMgPSBsYXN0KGFkZF90b19jYXJ0X29yZGVyKSkgJT4lDQoJYXJyYW5nZShvcmRlcnNfaWQpDQoNCiNpdGVtc19wZXJfb3JkZXINCg0KI2NvdW50IHRoZSB0b3RhbCBudW1iZXIgb2YgYm91Z2h0IGl0ZW1zDQp0b3RfbnVtX3RyYW5zYWN0aW9ucyA8LSBpdGVtc19wZXJfb3JkZXIgJT4lDQoJc2VsZWN0KG5yX29mX2l0ZW1zKSAlPiUNCglzdW0oKQ0KDQojam9pbiBpdGVtc19wZXJfb3JkZXIgdGFibGUgYW5kIG9yZGVyX2ZyZXEgb3ZlciB0X29yZGVycyB0YWJsZQ0KZnJhbmtlbnN0ZWluIDwtIGxlZnRfam9pbihvcmRlcl9mcmVxLCB0X29yZGVycywgInVzZXJfaWQiKSAlPiUNCglsZWZ0X2pvaW4oaXRlbXNfcGVyX29yZGVyLCAib3JkZXJzX2lkIikgJT4lDQoJbmEub21pdCgpICU+JQ0KCXNlbGVjdCgtYyhldmFsX3NldCwgb3JkZXJfZG93LCBvcmRlcl9ob3VyX29mX2RheSwgb3JkZXJfbnVtYmVyLCBkYXlzX3NpbmNlX3ByaW9yX29yZGVyKSkgJT4lDQoJZmlsdGVyKG1lYW5fZnJlcSA8PSBtYXhfZGF5c19zaW5jZV9sYXN0X2Zvcl9zdGFtbSkgJT4lDQoJZ3JvdXBfYnkobnJfb2ZfaXRlbXMpDQoNCiNyZXN1bHRpbmcgdGFibGUgaXMgDQojZnJhbmtlbnN0ZWluDQoNCmdncGxvdChkYXRhID0gZnJhbmtlbnN0ZWluKSArIA0KICBnZW9tX2JhcihtYXBwaW5nID0gYWVzKHggPSBucl9vZl9pdGVtcyksIHdpZHRoID0gMC45LCBmaWxsID0gIiNGRjk5OTkiKSArDQogIHhsYWIoIk51bWJlciBvZiBpdGVtcyBwZXIgY2xpZW50IikgKyB5bGFiKCJOciBvZiBjbGllbnRzIikNCg0KI2NvdW50IHRoZSB0b2FsIG51bWJlciBvZiBib3VnaHQgaXRlbXMgZm9yIHN0YW1ta3VuZGVuDQpOdW1fb2ZfdHJhbnNhY3Rpb25zX3N0YW1tIDwtIGZyYW5rZW5zdGVpbiAlPiUNCglzZWxlY3QobnJfb2ZfaXRlbXMpICU+JQ0KCXN1bSgpDQoNCiNOdW1fb2ZfdHJhbnNhY3Rpb25zX3N0YW1tDQojdG90X251bV90cmFuc2FjdGlvbnMNCg0KUGVyemVudF90cmFuc19zdGFtbSA8LSAxMDAqTnVtX29mX3RyYW5zYWN0aW9uc19zdGFtbS90b3RfbnVtX3RyYW5zYWN0aW9ucw0KI1BlcnplbnRfdHJhbnNfc3RhbW0NCmBgYA0KRGllIEFuemFobCBhbiB0cmFuc2FjdGlvbmVuIGRhcyB2b24gU3RhbW1rdW5kZW4gZ2VhbWNodCB3dXJkZW4gZW50c3ByZWNoZW4gYHIgTnVtX29mX3RyYW5zYWN0aW9uc19zdGFtbWAgdm9uIGByIHRvdF9udW1fdHJhbnNhY3Rpb25zYC4gRGFzIGVudHNwcmljaHQgYHIgUGVyemVudF90cmFuc19zdGFtbWAlIGFsbGVyIHRyYW5zYWN0aW9uZW4uIA0KDQoNCiMjIEEgcHJpb3JpIEFsZ29yaXRobXVzDQoNCg0KDQpgYGB7cn0NCiMgY2xvc2UgdGhlIGNvbm5lY3Rpb24gKGRvbid0IGZvcmdldCB0byBjbGVhbnVwKQ0KZGJEaXNjb25uZWN0KGNvbikNCmRiVW5sb2FkRHJpdmVyKGRydikNCmBgYA0KDQoNCg0K